跳到主要内容

第9章:综合项目——待办事项应用

本章旨在通过一个综合项目——待办事项应用,帮助读者巩固之前所学的iOS开发知识,同时掌握如何使用Cursor进行项目开发。我们将从项目规划到实际开发,逐步完成一个功能完善的待办事项管理应用。


9.1 项目规划与设计

在开始编码之前,我们需要对项目进行详细的规划和设计,确保项目的结构清晰、功能完善。

9.1.1 需求分析

待办事项应用应具备以下功能:

  • 添加新的待办事项
  • 显示所有待办事项
  • 标记待办事项为已完成
  • 删除待办事项
  • 支持数据持久化存储
9.1.2 功能设计
  • 主界面:显示所有待办事项的列表
  • 添加界面:提供输入框和按钮,用于新增待办事项
  • 数据存储:使用Core Data或 UserDefaults 存储待办事项
9.1.3 数据结构设计

我们将使用Core Data存储待办事项。每个待办事项包含以下属性:

  • title(标题)
  • isCompleted(是否完成)
  • createdAt(创建时间)
9.1.4 UI设计
  • ViewController:主界面,使用 UITableView 显示待办事项
  • AddItemViewController:负责添加新待办事项的界面,包含 UITextField 和 UIButton

9.2 用户界面实现

接下来,我们实现应用的用户界面。以下是关键步骤:

9.2.1 创建主界面
  1. 在Storyboard中创建一个 ViewController,并设置其类为 ItemsViewController
  2. 在ViewController中添加一个 UITableView,并设置数据源和代理。
class ItemsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!

// 数据源
var items = [Item]() // Item为Core Data实体

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell")!
let item = items[indexPath.row]
cell.textLabel?.text = item.title
cell.accessoryType = item.isCompleted ? .checkmark : .none
return cell
}
}
9.2.2 添加事项界面
  1. 创建一个新的 ViewController,并设置其类为 AddItemViewController
  2. 添加 UITextField 和 UIButton,并设置相应的动作。
class AddItemViewController: UIViewController {
@IBOutlet weak var textField: UITextField!

@IBAction func addButtonTapped(_ sender: UIButton) {
if let text = textField.text, !text.isEmpty {
// 保存到Core Data
ItemManager.sharedInstance.addItem(title: text)
navigationController?.popViewController(animated: true)
}
}
}

9.3 数据存储与网络请求

9.3.1 使用 Core Data 存储

我们通过Core Data管理待办事项。创建一个 ItemManager 类来封装数据操作。

class ItemManager {
static let sharedInstance = ItemManager()

func addItem(title: String) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let item = Item(context: context)
item.title = title
item.isCompleted = false
item.createdAt = Date()

saveContext()
}

func fetchItems() -> [Item] {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest = NSFetchRequest<Item>(entityName: "Item")
do {
return try context.fetch(fetchRequest)
} catch {
print("无法获取数据")
return []
}
}

func saveContext() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
print("无法保存数据")
}
}
}
}
9.3.2 数据加载与更新

ItemsViewController 中,我们可以从 Core Data 加载数据:

override func viewDidLoad() {
super.viewDidLoad()
items = ItemManager.sharedInstance.fetchItems()
tableView.reloadData()
}

9.4 调试与测试

9.4.1 调试

在开发过程中,我们需要验证应用的逻辑是否正确。使用Xcode的调试工具:

  1. 添加断点,逐行分析代码执行过程。
  2. 使用控制台输出日志,检查数据变化。
9.4.2 测试
  1. 单元测试:测试 ItemManager 的逻辑是否正确。
  2. UI测试:测试应用界面是否响应用户的操作。

示例测试代码:

func testAddItem() {
let itemManager = ItemManager.sharedInstance
itemManager.addItem(title: "Test Item")
let items = itemManager.fetchItems()
assert(items.count == 1)
}

通过以上步骤,我们已经完成了一个简单的待办事项应用。开发者可以在此基础上进一步扩展功能,如支持分类、添加提醒等。希望本章能够帮助读者更好地掌握iOS开发的基础知识!